 /*******************************************************************************
  * Copyright (c) 2004, 2005 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.ui.internal.intro.impl.html;

 import java.util.Iterator ;
 import java.util.Map ;
 import java.util.Set ;

 /**
  * Convenience class for generating HTML elements.
  */
 public final class HTMLUtil {
     /**
      * Creates an HTML opening element of the form <elementName
      * elementAttributes>
      *
      * @param elementName
      * the name of the element to create
      * @param elementAttributes
      * a map of attribute names and values to be inserted into the
      * element start tag
      * @param insertLineBreak
      * true to insert a line break after the start tag is closed,
      * false otherwise
      * @return
      */
     public static StringBuffer createHTMLStartTag(String elementName,
             Map elementAttributes, boolean insertLineBreak) {
         StringBuffer element = new StringBuffer ();
         if (elementName != null) {
             // open the start tag
 element.append(openHTMLStartTag(elementName));
             // add the attributes, if there are any
 if (elementAttributes != null && !(elementAttributes.isEmpty()))
                 element.append(IIntroHTMLConstants.SPACE).append(
                         createAttributeList(elementAttributes));
             // close the start tag
 element.append(closeHTMLTag(insertLineBreak));
         }
         return element;
     }

     /**
      * Creates an HTML start tag of the form <elementName>
      *
      * @param elementName
      * the name of the element to create
      * @param insertLineBreak
      * true to insert a new line after the start tag
      * @return
      */
     public static StringBuffer createHTMLStartTag(String elementName,
             boolean insertLineBreak) {
         return createHTMLStartTag(elementName, null, insertLineBreak);
     }

     /**
      * Creates an HTML start tag of the form <elementName>and inserts a line
      * break after the start tag
      *
      * @param elementName
      * the name of the element to create
      * @return
      */
     public static StringBuffer createHTMLStartTag(String elementName) {
         return createHTMLStartTag(elementName, null, true);
     }

     /**
      * Creates an HTML closing element of the form </elementName>
      *
      * @param elementName
      * the name of the closing element to create
      * @param addNewLine
      * true to add a new line at the end
      * @return
      */
     public static StringBuffer createHTMLEndTag(String elementName,
             boolean addNewLine) {
         StringBuffer closingElement = new StringBuffer ();
         if (elementName != null)
             closingElement.append(IIntroHTMLConstants.LT).append(
                     IIntroHTMLConstants.FORWARD_SLASH).append(elementName)
                     .append(closeHTMLTag(addNewLine));
         return closingElement;
     }

     /**
      * Given a map of attribute names and values, this method will create a
      * StringBuffer of the attributes in the form: attrName="attrValue". These
      * attributes can appear in the start tag of an HTML element.
      *
      * @param attributes
      * the attributes to be converted into a String list
      * @return
      */
     public static String createAttributeList(Map attributes) {
         if (attributes == null)
             return null;
         StringBuffer attributeList = new StringBuffer ();
         Set attrNames = attributes.keySet();
         for (Iterator it = attrNames.iterator(); it.hasNext();) {
             Object name = it.next();
             Object value = attributes.get(name);
             if ((name instanceof String ) && (value instanceof String )) {
                 attributeList.append(createAttribute((String ) name,
                         (String ) value));
                 if (it.hasNext()) {
                     attributeList.append(IIntroHTMLConstants.SPACE);
                 }
             }
         }
         return attributeList.toString();
     }

     /**
      * Creates an HTML attribute of the form attrName="attrValue"
      *
      * @param attrName
      * the name of the attribute
      * @param attrValue
      * the value of the attribute
      * @return
      */
     public static StringBuffer createAttribute(String attrName, String attrValue) {
         StringBuffer attribute = new StringBuffer ();
         if (attrName != null && attrValue != null) {
             attribute.append(attrName).append(IIntroHTMLConstants.EQUALS)
                     .append(IIntroHTMLConstants.QUOTE).append(attrValue)
                     .append(IIntroHTMLConstants.QUOTE);
         }
         return attribute;
     }

     public static StringBuffer openHTMLStartTag(String elementName) {
         return new StringBuffer ().append(IIntroHTMLConstants.LT).append(
                 elementName);
     }

     public static StringBuffer closeHTMLTag() {
         return closeHTMLTag(true);
     }

     public static StringBuffer closeHTMLTag(boolean newLine) {
         StringBuffer closing = new StringBuffer ()
                 .append(IIntroHTMLConstants.GT);
         if (newLine)
             closing.append(IIntroHTMLConstants.NEW_LINE);
         return closing;
     }

     /**
      * Determine if the contents of two character arrays are equal
      *
      * @param a
      * @param b
      * @return
      */
     public static boolean equalCharArrayContent(char[] a, char[] b) {
         if (a.length != b.length)
             return false;
         for (int i = 0; i < a.length; i++) {
             if (a[i] != b[i])
                 return false;
         }
         return true;
     }
 }

